package com.test;


import com.test.controller.MyController;
import com.test.dao.UserDao;
import com.test.pojo.Demo;
import com.test.pojo.User;
import org.beetl.sql.core.*;
import org.beetl.sql.core.db.DBStyle;
import org.beetl.sql.core.db.KeyHolder;
import org.beetl.sql.core.db.MySqlStyle;
import org.beetl.sql.ext.DebugInterceptor;
import org.beetl.sql.ext.spring4.SqlManagerFactoryBean;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SpringBootTest
class SpringbootBeetsqlApplicationTest2 {


    Logger logger= LoggerFactory.getLogger(SpringbootBeetsqlApplicationTest2.class);

    @Autowired
    SqlManagerFactoryBean sqlManagerFactoryBean;


    //有了 SqlManagerFactoryBean 对象会自动生成这个对象
    @Autowired
    public SQLManager sqlmanager;




    //增删改查第一种方式  通过 SQLManager 对象来操作

    /*  unique()方法 通过主键查询
    * */

    @Test
    void contextLoads2() {
        User user = new User();
        int id = 1;


        //通过主键查找   条件有了
        //  User.class  封装的实体有了
        //  从哪个表找?  优先看 User 实体类 的  @Table 注解指定的表  没有实体类名字  就是  表名
        try {
            user = sqlmanager.unique(User.class,id);

            System.out.println(user);
        } catch (Exception e) {
            logger.warn("*************unique查询user,但数据库未找到结果集:主键是"+id);
        }






      /*  int age=3;


        //会把age看作主键  找不到会报错
        Demo unique = null;
        try {
            unique = sqlmanager.unique(Demo.class, age);   //查找哪个表  通过 Demo类的注解 @Table指定
        } catch (Exception e) {
            System.out.println("unique查询user,但数据库未找到结果集:主键是"+age);
        }

        System.out.println(unique);

        System.out.println(unique.getCreateDateStr());
*/



    }




    //增删改查第二种方式  通过 mapper 对象来操作
    @Test
    void contextLoads3() {

      UserDao dao = sqlmanager.getMapper(UserDao.class);

      //  List<User> xiandafu = dao.select2("xiandafu");
    //    System.out.println(xiandafu);

    }


    //增删改查   第二种方式的变种  更方便一点  而且 表和 实体类 不对应的时候  可以在 查询语句 中 转化
    @Test
    void contextLoads34() {


        Map<String,String> map=new HashMap<>();
        map.put("name","张三");

        List<User> list2 = sqlmanager.select("user.selectnull",User.class,map);
        System.out.println(list2);


        for (User user : list2) {

            System.out.println(user.getCreateDateStr());


        }



    }


    //增删改查   第二种方式的变种  更方便一点
    @Test
    void contextLoads344() {


        Map<String,String> map=new HashMap<>();
        map.put("name","xiandafu");

        List<Demo> list2 = sqlmanager.select("demo.select",Demo.class,map);
        
        System.out.println(list2);

    }



    @Test
    void contextLoads() {


        ConnectionSource source = ConnectionSourceHelper.getSimple(
                "com.mysql.cj.jdbc.Driver","jdbc:mysql://localhost:3306/beetsql?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false&useUnicode=true",
                "root","root"

        );
        DBStyle mysql = new MySqlStyle();
// sql语句放在classpath的/sql 目录下
        SQLLoader loader = new ClasspathLoader("/sql");
// 数据库命名跟java命名一样，所以采用DefaultNameConversion，还有一个是UnderlinedNameConversion，下划线风格的，
        UnderlinedNameConversion nc = new  UnderlinedNameConversion();
// 最后，创建一个SQLManager,DebugInterceptor 不是必须的，但可以通过它查看sql执行情况
        SQLManager sqlManager = new SQLManager(mysql,loader,source,nc,new Interceptor[]{new DebugInterceptor()});


//使用内置的生成的sql 新增用户，如果需要获取主键，可以传入KeyHolder
        User user = new User();
        user.setAge(19);
        user.setName("xiandafu");
        sqlManager.insert(user);

//使用内置sql查询用户
        int id = 1;
        user = sqlManager.unique(User.class,id);
        System.out.println(user);

//模板更新,仅仅根据id更新值不为null的列
        User newUser = new User();
        newUser.setId(1);
        newUser.setAge(20);
        sqlManager.updateTemplateById(newUser);

//模板查询
        User query = new User();
        query.setName("xiandafu");
        List<User> list = sqlManager.template(query);

//Query查询
      /*  Query userQuery = sqlManager.getQuery(User.class);
        List<User> users = userQuery.lambda().andEq(User::getName,"xiandafy").select();*/

//使用user.md 文件里的select语句，参考下一节。
        User query2 = new User();
        query.setName("xiandafu");
        List<User> list2 = sqlManager.select("user.select",User.class,query2);

// 这一部分需要参考mapper一章
       /* UserDao dao = sqlManager.getMapper(UserDao.class);
        List<User> list3 = dao.select(query2);*/
    }



    //自动生成 md 文件 末班
        @Test
        void getPojo(){
            try {
                sqlmanager.genPojoCodeToConsole("user");
                sqlmanager.genSQLTemplateToConsole("user");
            } catch (Exception e) {
                logger.info("未查询到表");
            }
        }


        @Test
        void updateUser(){
            //模板更新,仅仅根据id更新值不为null的列
            User newUser = new User();
            newUser.setAge(27);
            newUser.setName("鲁大");
            newUser.setId(1);

            //表自动对应User表
            sqlmanager.updateTemplateById(newUser);


        }



        //自定义修改
    @Test
    void updateUser2(){

        //这个 sql语句写的很妙  修改的时候用   具体修改哪个表 在md中 自定义

        Map<String, Object> params = new HashMap<String, Object>();

        params.put("name","李四");
        params.put("age", 20);
        params.put("id", 1);


        sqlmanager.update("user.updatedemo",params);





    }




        //模板查询 SQL：	 select * from `user` where 1=1 and `age`=?

        @Test
        void find(){

            User template = new User();
            template.setAge(18);

            //查询年龄为18的所有用户
            List<User> list = sqlmanager.template(template);
            System.out.println(list);

        }

       @Test
        void insert(){

            UserDao dao = sqlmanager.getMapper(UserDao.class);

            User newUser = new User();
            newUser.setAge(27);
            newUser.setName("");
            newUser.setId(6);




            // insert get不到的数据 插入  null
             dao.insert(newUser);
             /*newUser.setId(5);

           sqlmanager.insert(newUser);
*/



       //    dao.insert(newUser);

        }

        @Test
        void insert2(){

            UserDao dao = sqlmanager.getMapper(UserDao.class);

            User newUser = new User();
            newUser.setAge(24);


          //  newUser.setId(8);



            //insertTemplate 和 insert 的区别  get不到的 不出
            dao.insertTemplate(newUser);

        }


    @Test
    void insert3(){



        User newUser = new User();
        newUser.setAge(27);
        newUser.setName("测试插入");
        newUser.setId(2);

        //没整明白
        KeyHolder keyHolder = new KeyHolder();


       sqlmanager.insert(User.class,newUser,keyHolder);


    }


}
